package guestbook.service;

import guestbook.dao.SaludoDAO;
import guestbook.persistencia.Saludo;
import guestbook.persistencia.Usuario;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class SaludoServiceImpl implements SaludoService {


    private SaludoDAO saludoDao;
    private UsuarioService usuarioService;


    @Autowired
    @Required
    public void setSaludoDao(final SaludoDAO saludoDao) {
        this.saludoDao = saludoDao;
    }

    @Autowired
    @Required
    public void setUsuarioService(UsuarioService usuarioService) {
        this.usuarioService = usuarioService;
    }




    @Override
    public void create(final Saludo greeting) {
        saludoDao.insert(greeting);        
    }

    @Override
    public Collection<Saludo> getAllsaludos() {
        return saludoDao.getAll(Saludo.class);
    }

    @Override
    public Collection<Saludo> getPaginaSaludos(int startPosition, int maxResult) {
        return saludoDao.getOrderedPaginated(Saludo.class, startPosition, maxResult, "fecha", 2);
    }

    @Override
    public int countAllsaludos() {
        return saludoDao.countAll(Saludo.class);
    }

    @Override
    @PreAuthorize("isAuthenticated()")
    public void borrar(Long idSaludo) {
        if (usuarioService.isAdmin()) {
            borrarConAdmin(idSaludo);
        } else {
            Usuario user = usuarioService.getCurrentUser();
            Saludo saludo = saludoDao.findByPK(Saludo.class, idSaludo);
            if (user != null && saludo.getAuthor() != null && user.getUsername().equals(saludo.getAuthor())) {
                saludoDao.remove(saludo);
            }
        }
    }

    @PreAuthorize("isAuthenticated() and #saludo.author == principal.username")
    private void borrar(Saludo saludo) {
        saludoDao.remove(saludo);
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void borrarConAdmin(Long idSaludo) {
        Saludo saludo = saludoDao.findByPK(Saludo.class, idSaludo);
        saludoDao.remove(saludo);

    }


    @Override
    public Collection<Saludo> getMensajes(String author) {
        return saludoDao.getMensajes(author);
    }

    @Override
    public Saludo getSaludo(Long idSaludo) {
        return saludoDao.findByPK(Saludo.class, idSaludo);
    }
}
